#include <bits/stdc++.h>
using namespace std;
const int N = 210;
struct edge
{
    int u, v, w;
    bool operator<(const edge &a) const
    {
        return w > a.w;
    }
} edges[N * N];
int n, m;
int ret, count1;
int cnt[N][26]; // 记录每个字符串每一个字符出现的个数
string arr[N];
int p[N];
int find(int u)
{
    if (p[u] != u)
    {
        p[u] = find(p[u]);
    }
    return p[u];
}
// 传进来的是边数
bool kruskal(int ind)
{
    ret = 0;
    count1 = 0;
    sort(edges, edges + ind);
    for (int i = 0; i < ind; i++)
    {
        if (count1 >= n - 1)
            break;
        int u = edges[i].u;
        int v = edges[i].v;
        int w = edges[i].w;
        int pu = find(u), pv = find(v);
        if (pu != pv)
        {
            p[pu] = pv;
            count1++;
            ret += w;
        }
    }
    return count1 == n - 1;
}
//找到最长的公共长度最大
int help(int i, int j)
{
    string s = " "+arr[i] + arr[i]; // 环形扩展
    string t = " "+arr[j] + arr[j];
    //dp[i][j]代表s1以i结尾的子数组集合以及s2以j结尾的子数组集合
     vector<vector<int>> dp(2 * m+ 2, vector<int>(2 * m + 2, 0));
    for(int i=1;i<=2*m;i++)
    {
        for(int j=1;j<=2*m;j++)
        {
            if(s[i]==t[j])
            {
                dp[i][j]=dp[i-1][j-1]+1;
            }
            else
            {
                dp[i][j]=0;
            }
        }
    }
    int ret=0;
    for(int i=1;i<=2*m;i++)
    {
        for(int j=1;j<=2*m;j++)
        {
            ret=max(ret,dp[i][j]);
        }
    }
    return min(ret,m);
}
// int help(int i,int j)
// {
//     int ans=0;
//     for(char c='a';c<='z';c++)
//     {
//         int tem=min(cnt[i][c-'a'],cnt[j][c-'a']);
//         ans+=tem;
//     }
//     return ans;
// }
int main()
{
    memset(cnt, 0, sizeof(cnt));
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        p[i] = i;
    for (int i = 1; i <= n; i++)
    {
        string s;
        cin >> s;
        arr[i] = s;
        for (auto &ch : s)
        {
            cnt[i][ch - 'a']++;
        }
    }

    // for(int i=1;i<=n;i++)
    // {
    //     for(int j=0;j<26;j++)
    //     {
    //         cout<<cnt[i][j]<<" ";
    //     }
    //     cout<<endl;
    // }
    int ind = 0;
    for (int i = 1; i <= n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            int w = help(i, j);
            int u = i;
            int v = j;
            edges[ind++] = {u, v, w};
        }
    }
    if (kruskal(ind))
    {
        cout << ret;
    }
    else
    {
        cout << -1 << endl;
    }

    return 0;
}